home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / dtm / second.m < prev    next >
Text File  |  1991-06-18  |  6KB  |  283 lines

  1. || introduce b as {0,1}
  2. b == num
  3.  
  4. || introduce the simplex atoms
  5. s_not :: b -> b
  6. s_not 0 = 1
  7. s_not 1 = 0
  8.  
  9. s_and :: (b,b) -> b
  10. s_and (0,x) = 0
  11. s_and (x,0) = 0
  12. s_and (1,1) = 1
  13.  
  14. s_nand :: (b,b) -> b
  15. s_nand (0,x) = 1
  16. s_nand (x,0) = 1
  17. s_nand (1,1) = 0
  18.  
  19. s_nand3 :: (b,b,b) -> b
  20. s_nand3 (0,x,y) = 1
  21. s_nand3 (x,0,y) = 1
  22. s_nand3 (x,y,0) = 1
  23. s_nand3 (1,1,1) = 0
  24.  
  25. s_nand4 :: (b,b,b,b) -> b
  26. s_nand4 (0,x,y,z) = 1
  27. s_nand4 (x,0,y,z) = 1
  28. s_nand4 (x,y,0,z) = 1
  29. s_nand4 (x,y,z,0) = 1
  30. s_nand4 (1,1,1,1) = 0
  31.  
  32. s_or :: (b,b) -> b
  33. s_or (1,x) = 1
  34. s_or (x,1) = 1
  35. s_or (0,0) = 0
  36.  
  37. s_xor :: (b,b) -> b
  38. s_xor (x,x) = 0
  39. s_xor (x,y) = 1
  40.  
  41. || introduce the multiplex ones
  42. m_not :: [b] -> [b]
  43. m_not [] = []
  44. m_not (a:r) = s_not a:m_not r
  45.  
  46. m_and :: ([b],[b]) -> [b]
  47. m_and ([], x) = []
  48. m_and (x, []) = []
  49. m_and (a:r, b:s) = s_and (a,b):m_and (r,s)
  50.  
  51. m_or :: ([b],[b]) -> [b]
  52. m_or ([], x) = []
  53. m_or (x, []) = []
  54. m_or (a:r, b:s) = s_or (a,b):m_or (r,s)
  55.  
  56. m_xor :: ([b],[b]) -> [b]
  57. m_xor ([],x) = []
  58. m_xor (x,[]) = []
  59. m_xor (a:r, b:s) = s_xor (a,b):m_xor (r,s)
  60.  
  61. || introduce some flipflops
  62. || the initial state is given as first arg
  63. m_dff :: b -> [b] -> [b]
  64. m_dff q [] = [q]
  65. m_dff q (d:r) = q:m_dff d r
  66.  
  67. || de jkff heeft een hulp functie nodig voor de toestandsovergang
  68. m_jkff :: b -> ([b],[b]) -> [b]
  69. m_jkff q ([], k) = [q]
  70. m_jkff q (j, []) = [q]
  71. m_jkff q (j:d, k:d') = q:m_jkff (m_jknew q (j,k)) (d, d')
  72.                where
  73.                           m_jknew 0 (j, k) = j
  74.                           m_jknew 1 (j, k) = s_not k
  75.  
  76. || Def
  77. ||    parity :- B => B;
  78. ||    parity i = q where q = dff 0 (xor (q,i)) endwhere
  79. m_parity :: [b] -> [b]
  80. m_parity d = q
  81.              where q = 0:(m_xor (q,d))
  82. || Zet je in het rechter lid where q = m_dff 0 (m_xor (q,d))
  83. || krijg je een BLACK HOLE omdat het tweede argument van m_dff
  84. || nodig is om op te pattern matchen
  85.  
  86. || Op naar DTM
  87. dom == num -> b
  88.  
  89. || Voor het experiment willen we lijsten naar doms
  90. || kunnen converteren en vice versa
  91. todom :: [b] -> dom
  92. todom [] n = 0
  93. todom (a:r) 0 = a
  94. todom (a:r) n = todom r (n-1)
  95.  
  96. fromdom :: num -> dom -> [b]
  97. fromdom n f = fdom n f 0
  98.               where
  99.                  fdom n f k = [],n <= k;
  100.          fdom n f k = f k:fdom n f (k+1), n > k
  101.  
  102. fromdom2 :: num -> (dom,dom) -> [(b,b)]
  103. fromdom2 n (f,g) = fdom2 n (f,g) 0
  104.            where
  105.             fdom2 n (f,g) k = [],n <= k;
  106.             fdom2 n (f,g) k = (f k,g k):fdom2 n (f,g) (k+1), n > k
  107.  
  108. || We hebben ook zoiets als een tail operatie op doms nodig
  109. taild :: dom -> dom
  110. taild d n = d (n+1)
  111.  
  112. || nu de atoms
  113. dtm_not :: dom -> dom
  114. dtm_not d n = s_not (d n)
  115.  
  116. dtm_and :: (dom, dom) -> dom
  117. dtm_and (a,b) n = s_and (a n,b n)
  118.  
  119. dtm_or :: (dom, dom) -> dom
  120. dtm_or (a,b) n = s_or (a n, b n)
  121.  
  122. dtm_xor :: (dom, dom) -> dom
  123. dtm_xor (a,b) n = s_xor (a n,b n)
  124.  
  125. dtm_dff :: b -> dom -> dom
  126. dtm_dff q d 0 = q
  127. dtm_dff q d n = d (n-1)
  128.  
  129. || of als
  130. dtm_mdff :: b -> dom -> dom
  131. dtm_mdff q d 0 = q
  132. dtm_mdff q d n = dtm_mdff (d 0) (taild d) (n-1)
  133.  
  134. || Ook de jkff gaat op die manier
  135. dtm_jkff :: b -> (dom,dom) -> dom
  136. dtm_jkff q (j,k) 0 = q
  137. dtm_jkff q (j,k) n = dtm_jkff (dtm_jknew q (j 0,k 0)) (taild j,taild k) (n-1)
  138.              where
  139.             dtm_jknew 0 (j,k) = j
  140.             dtm_jknew 1 (j,k) = s_not k
  141.  
  142. || Nu de grote test
  143. dtm_parity :: dom -> dom
  144. dtm_parity d = q
  145.            where
  146.           q = dtm_mdff 0 (dtm_xor (q,d))
  147.  
  148. || Kunnen we het misschien wel nog iets preciezer
  149. || in TTL is de standaard poortvertraging ongeveer 10 ns
  150. || we laten nu een stap in de tijd hiermee corresponderen
  151.  
  152. || eerst de poorten:
  153. ttl_not :: dom -> dom
  154. ttl_not d 0 = 0            || Initieel is alles in rust
  155. ttl_not d n = s_not (d (n-1))
  156.  
  157. ttl_and :: (dom,dom) -> dom
  158. ttl_and (a,b) 0 = 0
  159. ttl_and (a,b) n = s_and (a (n-1),b (n-1))
  160.  
  161. ttl_nand :: (dom,dom) -> dom
  162. ttl_nand (a,b) 0 = 0
  163. ttl_nand (a,b) n = s_nand (a (n-1),b (n-1))
  164.  
  165. ttl_nand3 :: (dom,dom,dom) -> dom
  166. ttl_nand3 (a,b,c) 0 = 0
  167. ttl_nand3 (a,b,c) n = s_nand3 (a (n-1), b (n-1),c (n-1))
  168.  
  169. ttl_nand4 :: (dom,dom,dom,dom) -> dom
  170. ttl_nand4 (a,b,c,d) 0 = 0
  171. ttl_nand4 (a,b,c,d) n = s_nand4 (a (n-1), b (n-1),c (n-1),d (n-1))
  172.  
  173. ttl_or :: (dom,dom) -> dom
  174. ttl_or (a,b) 0 = 0
  175. ttl_or (a,b) n = s_or (a (n-1),b (n-1))
  176.  
  177. ttl_xor :: (dom,dom) -> dom
  178. ttl_xor (a,b) 0 = 0
  179. ttl_xor (a,b) 1 = 0
  180. ttl_xor (a,b) n = s_xor (a (n-2), b (n-2))
  181.  
  182. || Een schakeling met een hazard op de s ingang
  183. ttl_hazard :: (dom,dom,dom) -> dom
  184. ttl_hazard (s, a, b) = ttl_and (ttl_and (s,b), ttl_and (ttl_not s, a))
  185.  
  186. ||
  187. || Def
  188. ||    RSFF :- B & B => B & B;
  189. ||    RSFF (r,s) = (q,q')
  190. ||    where
  191. ||       q = nand (q',s)
  192. ||       q' = nand (q,s)
  193. ||    endwhere
  194.  
  195. ttl_rsff :: (dom,dom) -> (dom,dom)
  196. ttl_rsff (r,s) = (q,q')
  197.          where
  198.             q = ttl_nand (q',s)
  199.             q'= ttl_nand (q,r)
  200.  
  201. ||
  202. || Def
  203. ||    DFF :- B & B => B & B;
  204. ||    DFF (ck, d) = (q, q')
  205. ||    where
  206. ||       q = nand (q', q1);
  207. ||       q' = nand (q, q2);
  208. ||       q1 = nand (u1, ck);
  209. ||       u1 = nand (u4,q1);
  210. ||       q2 = nand3 (q1,ck,u4);
  211. ||       u4 = nand (q2, d)
  212. ||    endwhere
  213.  
  214. dff :: (dom,dom) -> (dom,dom)
  215. dff (ck, d) = (q,q')
  216.           where
  217.              q = ttl_nand (q', q1)
  218.              q' = ttl_nand (q, q2)
  219.              q1 = ttl_nand (u1, ck)
  220.              u1 = ttl_nand (u4,q1)
  221.              q2 = ttl_nand3 (q1,ck,u4)
  222.              u4 = ttl_nand (q2, d)
  223.  
  224. ttl_dff :: (dom,dom,dom,dom) -> (dom,dom)
  225. ttl_dff (ck,d,clr,pr) = (q,q')
  226.             where
  227.                q = ttl_nand3 (q',q1,pr)
  228.                q' = ttl_nand3 (q,q2,clr)
  229.                q1 = ttl_nand3 (u1, ck, clr)
  230.                u1 = ttl_nand3 (u4, q1, pr)
  231.                q2 = ttl_nand3 (q1, ck, u4)
  232.                u4 = ttl_nand3 (q2, d, clr)
  233.  
  234. int0 :: dom
  235. int0 0 = 0
  236. int0 1 = 0
  237. int0 n = 1
  238.  
  239. ones :: dom
  240. ones n = 1
  241.  
  242. div2 :: dom -> dom
  243. div2 ck = q
  244.       where
  245.          (q,q') = dff (ck,q')
  246.  
  247. ttl_div2 :: dom -> dom
  248. ttl_div2 ck = q
  249.           where
  250.         (q,q') = ttl_dff (ck,q',int0,ones)
  251.  
  252. ttl_jkff :: (dom,dom,dom,dom) -> (dom,dom)
  253. ttl_jkff (ck,j,k,clr) = (q,q')
  254.                 where
  255.                   q = ttl_nand (q',a)
  256.                   q' = ttl_nand3 (q,clr,b)
  257.                   a = ttl_nand (ck', q1)
  258.                   b = ttl_nand (ck', q1')
  259.                   q1 = ttl_nand (q1', c)
  260.                   q1' = ttl_nand3 (q1,clr,d)    
  261.                   c = ttl_nand4 (ck, q', j,clr)
  262.                   d = ttl_nand3 (ck, q, k)
  263.                   ck' = ttl_not ck
  264.  
  265. ttl_mjkff :: (dom,dom,dom,dom) -> (dom,dom)
  266. ttl_mjkff (ck,j,k,clr) = (q,q')
  267.              where
  268.                 q = ttl_nand (q',a)
  269.                 q' = ttl_nand3 (q, clr, b)
  270.                 a = ttl_nand (q1, c)
  271.                 b = ttl_nand (q1', d)
  272.                 q1 = ttl_nand (c, q1')
  273.                 q1' = ttl_nand3 (d, clr, q1)
  274.                 c = ttl_nand4 (ck, q', j,clr)
  275.                 d = ttl_nand3 (ck, q, k)
  276.  
  277. delay :: num -> dom -> dom
  278. delay k d n = 0, n < k
  279. delay k d n = s_not (d (n - k))
  280.  
  281. oscil :: num -> dom
  282. oscil k = q where q = delay k q
  283.